from random import *
from Jogo import *

pygame.init()
from pygame.locals import *
import pygame, sys, os

celulas = pygame.image.load("images" + os.sep + 'cell.png') 
vazio = pygame.image.load("images" + os.sep + 'cell_pressed.png')
mina = pygame.image.load("images" + os.sep + 'bomba.png')
background = pygame.image.load("images" + os.sep + "tela_jogo.jpg")
som_explosao = pygame.mixer.Sound("music" + os.sep + "explosao_espacial.wav")
game_over = pygame.image.load("images" + os.sep + "gameover.jpg")
winner = pygame.image.load("images" + os.sep + "winner.jpg")
bandeira = pygame.image.load("images" + os.sep + 'bandeira.png')
ok = pygame.mixer.Sound("music" + os.sep + "ok.wav")
limpa_tela = pygame.image.load("images" + os.sep + "limpa_tela.png")
inicio = pygame.image.load("images" + os.sep + "inicio1.jpg")


altura = 0
largura = 0
matriz_aux = []

"""
Ajuda:
	a funcao imprime o campo de acordo com o 
	plano carteziano, portanto que le entenda
	x = largura = j  e  y = altura = i
"""
def cores(pos):
        cor = (0,0,0)
        if pos == "1":
                cor = (200,50,50)
        elif pos == "2":
                cor = (200,50,200)
        elif pos == "3":
                cor = (50,100,250)
        elif pos == "4":
                cor = (50,250,20)
        else:
                cor = (130 ,200 ,130)
        return cor

def imprime_campo(matriz, altura_tela, largura_tela,com_som):

	screen = pygame.display.set_mode((altura_tela, largura_tela), 0, 32)
        
        if altura_tela == 500:
                screen.blit(inicio,((altura_tela/2)+80,(largura_tela/2)-60))
                newgame_pos = (330,70)
                newgame_buttons = [pygame.image.load("images" + os.sep + "inicio" + str(i+1) + ".jpg") for i in xrange(2)]
        elif altura_tela == 770:
                screen.blit(inicio,((altura_tela/2)+200,(largura_tela/2)-90))
                newgame_pos = (585,167.5)
                newgame_buttons = [pygame.image.load("images" + os.sep + "inicio" + str(i+1) + ".jpg") for i in xrange(2)]
       
        else:
                screen.blit(inicio,((altura_tela/2)+290,(largura_tela/2)-100))
                newgame_pos = (740,157.5)
                newgame_buttons = [pygame.image.load("images" + os.sep + "inicio" + str(i+1) + ".jpg") for i in xrange(2)]
       

        newgame_button = newgame_buttons[0]
        newgame_size = newgame_button.get_size()
        

	global altura, largura, matriz_aux, visitados
	altura = len(matriz)
	largura = len(matriz[0])

	matriz_aux = []
        lista_bandeira = []
        clicados = []
                
	num_bombas = 0
	num_sem_minas = 0
        mina_encontrada = 0
        novo_jogo = 0

	for i in range(altura):
		linha_aux = []
		for j in range(largura):
			if matriz[i][j] == "B":
				num_bombas += 1
				linha_aux.append("B")
			else:
				num_sem_minas += 1
				linha_aux.append(False)
		matriz_aux.append(linha_aux)
	
	for i in range(altura):
		for j in range(largura):
		   screen.blit(celulas,(j*32,i*32))

	exit_buttons = [pygame.image.load("images" + os.sep + "back" + str(i+1) + ".png") for i in xrange(2)]
	exit_button = exit_buttons[0]
	exit_size = exit_button.get_size()
	exit_pos = (altura_tela - 65, largura_tela - 40)
	pressed = False
	

        if altura_tela == 500:
                qnt_bandeiras = 10
               
        elif altura_tela == 770:
                qnt_bandeiras = 40
               
        else:
                qnt_bandeiras = 99
                


	while True:
		events = pygame.event.get()
		
                for event in events:
			if event.type == pygame.QUIT:
				sys.exit()

		mouse_pos = pygame.mouse.get_pos()
		mouse_press = pygame.mouse.get_pressed()
		
                if newgame_pos[0] <= mouse_pos[0] <= newgame_pos[0] + newgame_size[0] and newgame_pos[1] <= mouse_pos[1] <= newgame_pos[1] + newgame_size[1]:
                    newgame_button = newgame_buttons[1]

                    if mouse_press[0]:
                        newgame_button = newgame_buttons[1] 
                        pressed = True

                    if pressed and not mouse_press[0]:
                        newgame_button = newgame_buttons[0]
                        return imprime_campo(inicia_jogo(altura, largura, num_bombas), altura_tela, largura_tela,com_som)
                        
                
                else: newgame_button = newgame_buttons[0]


                        
		if exit_pos[0] <= mouse_pos[0] <= exit_pos[0] + exit_size[0] and exit_pos[1] <= mouse_pos[1] <= exit_pos[1] + exit_size[1]:
			exit_button = exit_buttons[1]

			if mouse_press[0]:
				exit_button = exit_buttons[1]
				pressed = True

			if pressed and not mouse_press[0]:
				exit_button = exit_buttons[0]
                                return

		else: exit_button = exit_buttons[0]

		if not mouse_press[0]:
			pressed = False


                if altura_tela == 500:
                        fonte = pygame.font.SysFont("courrier new", 32, bold = False)
                        str_bandeiras = fonte.render("Numero de Bandeiras", True, [255,255,255])
                        int_bandeiras = fonte.render(str(qnt_bandeiras),True,[255,255,255])
                        screen.blit(limpa_tela,((altura_tela/2)+115,(largura_tela/2)-95))
                        screen.blit(str_bandeiras,((altura_tela/2)+10,(largura_tela/2)-120))
                        screen.blit(int_bandeiras,((altura_tela/2)+115,(largura_tela/2)-95))

                elif altura_tela == 770:
                        fonte = pygame.font.SysFont("courrier new", 32, bold = False)
                        str_bandeiras = fonte.render("Numero de Bandeiras", True, [255,255,255])
                        int_bandeiras = fonte.render(str(qnt_bandeiras),True,[255,255,255])
                        screen.blit(limpa_tela,((altura_tela/2)+235,(largura_tela/2)-225))
                        screen.blit(str_bandeiras,((altura_tela/2)+140,(largura_tela/2)-250))
                        screen.blit(int_bandeiras,((altura_tela/2)+240,(largura_tela/2)-220))

                else:
                        fonte = pygame.font.SysFont("courrier new", 32, bold = False)
                        str_bandeiras = fonte.render("Numero de Bandeiras", True, [255,255,255])
                        int_bandeiras = fonte.render(str(qnt_bandeiras),True,[255,255,255])
                        screen.blit(limpa_tela,((altura_tela/2)+320,(largura_tela/2)-230))
                        screen.blit(str_bandeiras,((altura_tela/2)+220,(largura_tela/2)-255))
                        screen.blit(int_bandeiras,((altura_tela/2)+320,(largura_tela/2)-225))
        

                

                if mouse_press[2] == 1 and (mouse_pos[0] < int(info_campo()[0])*32 and mouse_pos[1] < int(info_campo()[1])*32):
                        j, i = mouse_pos[0] / 32, mouse_pos[1] / 32
                        
                        if (i,j) not in visitados and mina_encontrada == 0 and (i,j) not in clicados:
                                
                                if [True,(i,j)] in lista_bandeira:
                                        lista_bandeira.remove([True,(i,j)])
                                        screen.blit(celulas, (j*32,i*32))
                                        qnt_bandeiras += 1
                                elif [True,(i,j)] not in lista_bandeira and qnt_bandeiras != 0:
                                        lista_bandeira.append([True,(i,j)])
                                        screen.blit(bandeira, (j*32,i*32))
                                        qnt_bandeiras -= 1
                

		if mouse_press[0] == 1 and (mouse_pos[0] < int(info_campo()[0])*32 and mouse_pos[1] < int(info_campo()[1])*32):
			j, i = mouse_pos[0] / 32, mouse_pos[1] / 32       
			if [True,(i,j)] not in lista_bandeira and mina_encontrada == 0:
                                clicados.append((i,j))
                                visitados = [(i,j)]
      
                                if matriz[i][j] == " ":
                                        matriz_aux[i][j] = True
                                        marca_vazia(screen, matriz, i, j,clicados,lista_bandeira)
                                        if com_som == 0:
                                                ok.play(1,1000)
                                        else:
                                                ok.stop()
                        
                                if matriz[i][j] == "B":
                                        screen.blit(mina, (j*32,i*32))
                                        mina_encontrada = 1
                                        for i in range(len(matriz)):
                                                for j in range(len(matriz[0])):
                                                        if matriz[i][j] == "B":
                                                                screen.blit(vazio, (j*32,i*32))
                                                                screen.blit(mina, (j*32,i*32))
                                                                if com_som == 0 :
                                                                        som_explosao.play(4,2700)
                                                                else:
                                                                        som_explosao.stop()

                                                        else:
                                                                valor = pygame.font.SysFont("courrier new", 32, bold = False)
                                                                numero = valor.render(matriz[i][j], True, cores(matriz[i][j]))
                                                                screen.blit(vazio, (j*32,i*32))
                                                                screen.blit(numero, ((j*32)+10,(i*32)+10))
                                        if altura_tela == 500:
                                                screen.blit(game_over,((altura_tela/2)+80,(largura_tela/2)-60))
                                        elif altura_tela == 770:
                                                screen.blit(game_over,((altura_tela/2)+200,(largura_tela/2)-90))
                                        else:
                                                screen.blit(game_over,((altura_tela/2)+290,(largura_tela/2)-100))

			        else:
                                        matriz_aux[i][j] = True
                                        valor = pygame.font.SysFont("courrier new", 32, bold = False)
                                        numero = valor.render(matriz[i][j], True, cores(matriz[i][j]))
                                        screen.blit(vazio, (j*32,i*32))
                                        screen.blit(numero, ((j*32)+10,(i*32)+10))
                                        if com_som == 0:
                                                ok.play(1,1000)
                                        else:
                                                ok.stop()
                        

                num_minas_pressed = 0


		for i in range(altura):
			for j in range(largura):
				if matriz_aux[i][j] != "B" and matriz_aux[i][j]:
					num_minas_pressed += 1

		if num_minas_pressed == num_sem_minas:
                        mina_encontrada = 1
			if altura_tela == 500:
                                screen.blit(winner,((altura_tela/2)+80,(largura_tela/2)-60))
                        elif altura_tela == 770:
                                screen.blit(winner,((altura_tela/2)+200,(largura_tela/2)-90))
                        else:
                                screen.blit(winner,((altura_tela/2)+290,(largura_tela/2)-100))


                

		screen.blit(background, exit_pos)
		screen.blit(exit_button, exit_pos)
		pygame.display.flip()
		

		

posicoesVisinhas = [(-1,-1),(-1,0),(-1,1),(1,-1),(1,0),(1,1),(0,-1),(0,1)] 
visitados = []
cor = (0 ,0 ,0)

def marca_vazia(screen,matriz,i,j,lista,lista2):
	global visitados, matriz_aux
	for posicao in posicoesVisinhas:
		posicaoVisinha = (i+posicao[0],j+posicao[1])
		if posicaoVisinha[0] >= 0 and posicaoVisinha[0] < altura and posicaoVisinha[1] >= 0 and posicaoVisinha[1] < largura and (posicaoVisinha[0],posicaoVisinha[1]) not in visitados:
                        if [True,(posicaoVisinha[0],posicaoVisinha[1])] not in lista2:
                                visitados.append((posicaoVisinha[0],posicaoVisinha[1]))
                                lista.append((posicaoVisinha[0],posicaoVisinha[1]))
                                if matriz[posicaoVisinha[0]][posicaoVisinha[1]] == " ":
                                        matriz_aux[posicaoVisinha[0]][posicaoVisinha[1]] = True
                                        screen.blit(vazio, (posicaoVisinha[1]*32,posicaoVisinha[0]*32))
                                        marca_vazia(screen,matriz,posicaoVisinha[0],posicaoVisinha[1],lista,lista2)
                                                
                                else:
                                        matriz_aux[posicaoVisinha[0]][posicaoVisinha[1]] = True
                                        valor = pygame.font.SysFont("courrier new", 32, bold = False)
                                        numero = valor.render(matriz[posicaoVisinha[0]][posicaoVisinha[1]], True, cores(matriz[posicaoVisinha[0]][posicaoVisinha[1]]))
                                        screen.blit(vazio, (posicaoVisinha[1]*32,posicaoVisinha[0]*32))
                                        screen.blit(numero, ((posicaoVisinha[1]*32)+10,(posicaoVisinha[0]*32)+10))
                        
